/**
 * 接口作用：
 *      限定对象的属性类型
 * 语法：
 *      interface I首字母大写
 *
 *  ? : 可选属性
 *  readonly: 只读属性
 */
interface IPerson {
    readonly id: string;
    name: string;
    age: number;
    sex?: string;
}

let p1: IPerson = {
    id: 'xxx2312',
    name: 'ddone',
    age: 10
}
console.log(p1.name, p1.age);

let p2: IPerson = {
    id: '2321xjkdf',
    name: 'zhangsan',
    age: 20,
    sex: 'boy'
}

p1.age = 11;

p2.sex = 'secret';

// p1.id = 'dfkjk123'; // 报错： 只读属性不可修改

// 接口限定方法
interface IBoyFirend {
    name: string;
    sex: string;
    car?: string;

    cook(): void;

    say: () => void;
}

let b1: IBoyFirend = {
    name: 'zhangsan',
    sex: '男',
    car: '30min 1.5',
    cook() {
        console.log('我会做西红柿炒鸡蛋')
    },
    say() {
        console.log('米饭管够')
    }
}

/*
接口限定类
    类实现一个接口，那么就要有该接口定义的所有的属性和方法
    class 类 implements 接口{ 

    }
    一个类可以实现多个接口
    这个类就要有所有这些接口定义的属性和方法
    class 类 implements 接口1,接口2,...{

    }

    接口可以继承
    interface 接口1 extends 接口2,接口3{

    }

    同名的接口可以重复定义，重复定义的属性和方法，都会成为该接口的限定
*/

interface IHuman {
    name: string;
    sex: string;
    age: number;
}

interface IGrilFriend {
    money: number;

    cook(): void;
}

/**
 *
 */
class Person implements IGrilFriend, IHuman {
    name: string;
    sex: string;
    age: number;
    money: number;

    cook(): void {
        console.log('我会做饭')
    }
}

// 接口的继承
// 接口阶乘，子接口就有了父接口所有的属性和方法的限定
interface IGoddess extends IGrilFriend, IHuman {

}

class Animal implements IGoddess {
    name: string;
    sex: string;
    age: number;
    money: number;

    cook(): void {
        console.log('我会做饭')
    }
}

// 同名接口，属性都会成为该接口的类型限定
interface ICar {
    name: string;
}

interface ICar {
    age: number;
}

let c1: ICar = {
    name: 'poerche',
    age: 20
}


export {}